/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package usl;

import com.mysql.jdbc.Statement;
import connezione.PooledConnection;
import hirondelle.date4j.DateTime;
import java.awt.List;
import javax.faces.context.FacesContext;
import login.BeanUser;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.TimeZone;

/**
 *
 * @author ren
 */
public class beanProgrammaVisite {

    PooledConnection conn;
    private String secondidoponascita;
    private String giornidopoultimavisita;
    private String descDopoUltimaVisita;
    private String descDopoNascita;
    private String descMedico;
    private String tipovisitaDopoNascita;
    private String tipovisitaMedico;
    private String tipovisitaDopoUltimaVisita;
    private final String programmatanascita = "PROGRAMMATA_NASCITA";
    private final String programmatamedico = "PROGRAMMATA_MEDICO";
    private final String periodico = "PERIODICO";
    
    private List listaSecondi;
    private List listaGiorni;

    /** Creates a new instance of beanProgrammaVisite */
    public beanProgrammaVisite() {
        conn = (PooledConnection) ((BeanUser) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user")).getCon();

        listaSecondi = new List(60);
        for (int i=1; i<61; i++) {
            listaSecondi.add(String.valueOf(i));
        }
        listaGiorni = new List(365);
         for (int i=1; i<366; i++) {
            listaGiorni.add(String.valueOf(i));
        }
              
    }

    public String eseguiProgrammazioneNascita() throws SQLException {
        
        Statement stmt = (Statement) conn.createStatement();
        ResultSet persone = stmt.executeQuery("SELECT id, id_medico, data_nascita from Persona WHERE tipo_persona = \"PAZIENTE\"");
        while (persone.next()) {
          int id_pers = persone.getInt("id");
            int id_med = persone.getInt("id_medico");
             String data_nascita = persone.getString("data_nascita");
             String data_vacc = new DateTime(data_nascita).plus(0, 0, 0, 0, 0, Integer.parseInt(secondidoponascita), DateTime.DayOverflow.Abort).toString();
         
             
             stmt.executeUpdate("INSERT INTO `db_user15`.`Visita` (`id_paziente`, `id_medico`, `data_scadenza`, `tipo_visita`, `descrizione`, `tipo_scadenza`, `richiami`) VALUES (" + id_pers + ", " + id_med + ", '" + data_vacc + "', '" + tipovisitaDopoNascita + "', '" + getDescDopoNascita() + "', '" + programmatanascita + "', 0)");


        }
        return "back";
    }

    public String eseguiProgrammazioneMedico() throws SQLException {

        Statement stmt = (Statement) conn.createStatement();
        ResultSet persone = stmt.executeQuery("SELECT id_persona, id_medico from Utenti WHERE tipo_persona = \"PAZIENTE\"");
        while (persone.next()) {
            
             int id_pers = persone.getInt("id_persona");
            int id_med = persone.getInt("id_medico");
            String data_disponibilita = getDataDisponibilitaMedico(id_med);
            
            //assumo che la data di disponibilita ci sia sempre e sia sempre > della data di oggi.
            //quindi inserisco la visita senza controlli
            
            
             stmt.executeUpdate("INSERT INTO `db_user15`.`Visita` (`id_paziente`, `id_medico`, `data_scadenza`, `tipo_visita`, `descrizione`, `tipo_scadenza`, `richiami`) VALUES (" + id_pers + ", " + id_med + ", '" + data_disponibilita + "', '" + tipovisitaMedico + "', '" + getDescMedico() + "', '" + programmatamedico + "', 0)");

            
            
            
            
        }
        return "back";
    }

    public String eseguiProgrammazioneUltimaVisita() throws SQLException {
        Statement stmt = (Statement) conn.createStatement();
        ResultSet persone = stmt.executeQuery("SELECT id_persona, id_medico from Utenti WHERE tipo_persona = \"PAZIENTE\"");
        while (persone.next()) {

            int id_pers = persone.getInt("id_persona");
            int id_med = persone.getInt("id_medico");
            String data_ultima_visita = getDataUltimaVisita(id_pers);
            DateTime data_now = DateTime.now(TimeZone.getDefault());


            if (data_ultima_visita != null) {
                //se ce stata una visita prima d oggi
                //controllo che aggiungendo i giorni siamo nel futuro   
                if (data_now.compareTo(new DateTime(data_ultima_visita).plusDays(new Integer(giornidopoultimavisita))) < 0) {


                    stmt.executeUpdate("INSERT INTO `db_user15`.`Visita` (`id_paziente`, `id_medico`, `data_scadenza`, `tipo_visita`, `descrizione`, `tipo_scadenza`, `richiami`) VALUES (" + id_pers + ", " + id_med + ", '" + new DateTime(data_ultima_visita).plusDays(new Integer(giornidopoultimavisita)) + "', '" + tipovisitaDopoUltimaVisita + "', '" + getDescDopoUltimaVisita() + "', '" + periodico + "', 0)");



                } else {
                    //fai comese non c sono stata una visita prima d oggi mette una visita a n giorni da oggi

                    stmt.executeUpdate("INSERT INTO `db_user15`.`Visita` (`id_paziente`, `id_medico`, `data_scadenza`, `tipo_visita`, `descrizione`, `tipo_scadenza`, `richiami`) VALUES (" + id_pers + ", " + id_med + ", '" + data_now.plusDays(new Integer(giornidopoultimavisita)) + "', '" + tipovisitaDopoUltimaVisita + "', '" + getDescDopoUltimaVisita() + "', '" + periodico + "', 0)");


                }


            } else {
                //se non c sono stata una visita prima d oggi mette una visita a n giorni da oggi
                stmt.executeUpdate("INSERT INTO `db_user15`.`Visita` (`id_paziente`, `id_medico`, `data_scadenza`, `tipo_visita`, `descrizione`, `tipo_scadenza`, `richiami`) VALUES (" + id_pers + ", " + id_med + ", '" + data_now.plusDays(new Integer(giornidopoultimavisita)) + "', '" + tipovisitaDopoUltimaVisita + "', '" + getDescDopoUltimaVisita() + "', '" + tipovisitaDopoUltimaVisita + "', 0)");

            }


        }



        return "back";
    }

    //dato un id di un paziente rirorna la data dell'ultima visita prima di oggi
    private String getDataUltimaVisita(int id) throws SQLException {
        String result = null;
        Statement stmt = (Statement) conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT TIMEDIFF(NOW(), v.data_scadenza) , v.* FROM Visita as v WHERE TIMEDIFF(NOW(), v.data_scadenza) > 0 AND id_paziente = " + id + " ORDER BY data_scadenza DESC LIMIT 1");
        if (rs.next()) {
            result = rs.getString("data_scadenza");
        }

        return result;
    }
    
    
    
       private String getDataDisponibilitaMedico(int id_m) throws SQLException {
        String result = null;
        Statement stmt = (Statement) conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT data_disponibilita FROM Disponibilita_medico WHERE id_medico = " + id_m);
        if (rs.next()) {
            result = rs.getString("data_disponibilita");
        }
        return result;
    }
    
    
    
    

    /**
     * @return the secondidoponascita
     */
    public String getSecondidoponascita() {
        return secondidoponascita;
    }

    /**
     * @param secondidoponascita the secondidoponascita to set
     */
    public void setSecondidoponascita(String secondidoponascita) {
        this.secondidoponascita = secondidoponascita;
    }

    /**
     * @return the programmata
     */
    public String getProgrammata() {
        return getTipovisita();
    }

    /**
     * @return the programmatanascita
     */
    public String getProgrammatanascita() {
        return programmatanascita;
    }

    /**
     * @return the giornidopoultimavisita
     */
    public String getGiornidopoultimavisita() {
        return giornidopoultimavisita;
    }

    /**
     * @param giornidopoultimavisita the giornidopoultimavisita to set
     */
    public void setGiornidopoultimavisita(String giornidopoultimavisita) {
        this.giornidopoultimavisita = giornidopoultimavisita;
    }

    /**
     * @return the periodico
     */
    public String getPeriodico() {
        return periodico;
    }

    /**
     * @return the programmatamedico
     */
    public String getProgrammatamedico() {
        return programmatamedico;
    }

    /**
     * @return the desc
     */
    public String getDesc() {
        return getDescDopoUltimaVisita();
    }

    /**
     * @param desc the desc to set
     */
    public void setDesc(String desc) {
        this.setDescDopoUltimaVisita(desc);
    }

    /**
     * @return the tipovisita
     */
    public String getTipovisita() {
        return getTipovisitaDopoNascita();
    }

    /**
     * @param tipovisita the tipovisita to set
     */
    public void setTipovisita(String tipovisita) {
        this.setTipovisitaDopoNascita(tipovisita);
    }

    /**
     * @return the tipovisitaMedico
     */
    public String getTipovisitaMedico() {
        return tipovisitaMedico;
    }

    /**
     * @param tipovisitaMedico the tipovisitaMedico to set
     */
    public void setTipovisitaMedico(String tipovisitaMedico) {
        this.tipovisitaMedico = tipovisitaMedico;
    }

    /**
     * @return the tipovisitaDopoUltimaVisita
     */
    public String getTipovisitaDopoUltimaVisita() {
        return tipovisitaDopoUltimaVisita;
    }

    /**
     * @param tipovisitaDopoUltimaVisita the tipovisitaDopoUltimaVisita to set
     */
    public void setTipovisitaDopoUltimaVisita(String tipovisitaDopoUltimaVisita) {
        this.tipovisitaDopoUltimaVisita = tipovisitaDopoUltimaVisita;
    }

    /**
     * @return the descDopoNascita
     */
    public String getDescDopoNascita() {
        return descDopoNascita;
    }

    /**
     * @param descDopoNascita the descDopoNascita to set
     */
    public void setDescDopoNascita(String descDopoNascita) {
        this.descDopoNascita = descDopoNascita;
    }

    /**
     * @return the descMedico
     */
    public String getDescMedico() {
        return descMedico;
    }

    /**
     * @param descMedico the descMedico to set
     */
    public void setDescMedico(String descMedico) {
        this.descMedico = descMedico;
    }

    /**
     * @return the descDopoUltimaVisita
     */
    public String getDescDopoUltimaVisita() {
        return descDopoUltimaVisita;
    }

    /**
     * @param descDopoUltimaVisita the descDopoUltimaVisita to set
     */
    public void setDescDopoUltimaVisita(String descDopoUltimaVisita) {
        this.descDopoUltimaVisita = descDopoUltimaVisita;
    }

    /**
     * @return the tipovisitaDopoNascita
     */
    public String getTipovisitaDopoNascita() {
        return tipovisitaDopoNascita;
    }

    /**
     * @param tipovisitaDopoNascita the tipovisitaDopoNascita to set
     */
    public void setTipovisitaDopoNascita(String tipovisitaDopoNascita) {
        this.tipovisitaDopoNascita = tipovisitaDopoNascita;
    }

    /**
     * @return the listaSecondi
     */
    public List getListaSecondi() {
        return listaSecondi;
    }

    /**
     * @return the listaGiorni
     */
    public List getListaGiorni() {
        return listaGiorni;
    }
    
    
  
}
